이 노트북은 제이크 반더플라스(Jake VanderPlas)의 A Whirlwind Tour of Python(OReilly Media, 2016)를 기반으로 만들어졌습니다. 이 내용은 CC0 라이센스를 따릅니다. 전체 노트북의 목록은 https://github.com/rickiepark/WhirlwindTourOfPython 에서 볼 수 있습니다.

< 연산자 | 목차 | 기본 데이터 구조 >

간단한 기본 데이터 타입

파이썬 변수와 객체에 대해 이야기할 때 모든 파이썬 객체는 타입 정보를 포함한다는 사실을 언급했습니다. 이 섹션에서 파이썬에서 제공하는 기본 데이터 타입을 간단히 소개하겠습니다. "간단한 데이터 타입"이라는 것은 다음 섹션에서 이야기할 일부 복합적인 데이터 타입에 대조되는 의미로 사용했습니다.

파이썬의 간단한 데이터 타입은 다음 표에 정리한 것과 같습니다:

**파이썬 스칼라(Scalar) 타입**
타입 설명
int x = 1 정수
float x = 1.0 부동소수 (즉, 실수)
complex x = 1 + 2j 복소수 (즉, 실수와 허수로 구성된 수)
bool x = True 불리언: True/False 값
str x = 'abc' 문자열: 문자나 텍스트
NoneType x = None null을 의미하는 특별한 객체

차례대로 하나씩 둘러 보겠습니다.

정수

가장 기본적인 수치형 타입은 정수입니다. 소수점이 없는 모든 숫자는 정수입니다:

파이썬 정수는 사실 C같은 언어의 정수보다 훨씬 복잡합니다. C 정수는 정밀도가 고정되어 있어서 어떤 값 이상은 담을 수 없습니다(컴퓨터에 따라서 $2^{31}$나 $2^{63}$). 파이썬 정수는 가변 정밀도를 가지고 있어서 다른 언어라면 오버플로우(overflow)가 날 수 있는 연산을 할 수 있습니다:

파이썬 정수의 또 다른 편리한 특징은 기본적으로 나눗셈을 하면 부동소수로 변환해주는 점입니다:

이런 타입 변환은 파이썬 3의 특징입니다. 파이썬 2에서는 C 같이 정적인 타입을 가진 언어들처럼 정수 나눗셈을 하면 소수 이하는 버리고 정수 부분만 반환합니다:

# Python 2 behavior
>>> 5 / 2
2

파이썬 3에서 이와 같이 하려면 몫 연산자를 사용합니다:

마지막으로 파이썬 2.xintlong 타입을 가지고 있지만, 파이썬 3은 이 둘을 하나의 int 타입으로 합쳤습니다.

부동소수

부동소수 타입은 분수를 저장할 수 있습니다. 기본 10진법 표기나 지수 표기를 사용할 수 있습니다:

지수 표기에서 eE는 "10의 ~ 제곱"로 읽을 수 있습니다. 1.4e6은 $~1.4 \times 10^6$가 됩니다.

정수는 float 함수를 사용해 부동소수로 강제로 변환할 수 있습니다:

사이드노트: 부동소수점 정밀도

부동소숫점 계산에서 알아야 할 한가지는 정밀도에 한계가 있기 때문에 동일한 값인지 테스트하는 것이 불안정할 수 있습니다. 예를 들어:

왜 이런 일이 생길까요? 이는 파이썬에만 있는 문제가 아니라 이진 부동소수점을 저장하는데 고정 정밀도를 사용하는 전부는 아니더라도 대부분의 과학 컴퓨팅 플랫폼에서 발생합니다. 부동소수를 사용하는 모든 프로그래밍 언어는 한정된 개수의 비트에 이를 저장하므로 일부 숫자는 근사적으로 표현됩니다. 소숫점 이하 정밀도를 높여 확인해 보면 이를 알 수 있습니다:

우리는 숫자를 10진수로 생각하는 게 익숙하므로 분수를 10의 제곱의 합으로 표현할 수 있습니다: $$ 1 /8 = 1\cdot 10^{-1} + 2\cdot 10^{-2} + 5\cdot 10^{-3} $$ 이 10진법 표현은 익숙한 십진수가 됩니다: $0.125$

컴퓨터는 보통 이진법으로 데이터를 저장하므로 숫자가 2의 제곱의 합으로 표현됩니다: $$ 1/8 = 0\cdot 2^{-1} + 0\cdot 2^{-2} + 1\cdot 2^{-3} $$ 2진법 표현에서 $0.001_2$라고 쓸 때 아래 첨자 2는 이진법을 의미합니다. $0.125 = 0.001_2$는 이진법과 십진법을 사용해 한정된 개수의 숫자로 나타낼 수 있는 한 예입니다.

10진법 표현에서 한정된 개수의 숫자로 나타낼 수 없는 값이 있습니다. 예를 들어, $1$을 $3$으로 나누면 기본 10진수로는 다음과 같습니다: $$ 1 / 3 = 0.333333333\cdots $$ 3이 계속됩니다. 즉 이를 완벽하게 나타내려면 무한한 개수의 숫자가 필요합니다!

비슷하게 이진 표현으로는 무한한 숫자가 필요한 값이 있습니다. 예를 들어: $$ 1 / 10 = 0.00011001100110011\cdots_2 $$ 십진수에서 $1/3$을 완벽하게 표현하려면 무한한 숫자가 필요하듯이 이진수에서도 $1/10$을 표현하려면 무한한 숫자가 필요합니다. 대부분의 시스템에서 파이썬은 내부적으로 이런 표현을 첫 번째 0이 아닌 비트에서부터 52비트까지만 유지합니다.

부동소수의 반올림 오차는 부동소수를 사용하기 위한 필요악입니다. 이에 대해 대처하는 가장 좋은 방법은 부동소수 연산이 근사값이므로 절대로 부동소수를 사용해 같은 값인지를 확인하는 테스트를 해서는 안된다는 사실을 유념하는 것입니다.

복소수

복소수는 실수와 허수부가 있는 숫자입니다. 이전에 정수와 실수를 보았는데 이를 사용해 허수를 만들 수 있습니다:

다른 방법으로 표현식에서 허수부를 의미하는 "j" 첨자를 사용할 수 있습니다:

복소수는 흥미로운 특성과 메서드를 많이 가지고 있습니다. 여기서 조금 둘러 보겠습니다:

문자열 타입

파이썬에서 문자열은 단일 따옴표나 이중 따옴표로 만들어 집니다:

파이썬에는 아주 유용한 문자열 함수들과 메서드들이 많이 있습니다. 그중에 몇 개를 살펴 보겠습니다:

파이썬의 인덱싱에 대해서는 "리스트"를 참고하세요.

None 타입

파이썬에는 NoneType이라는 특별한 타입이 포함되어 있습니다. 이 타입의 값은 None 하나만 가능합니다. 예를 들면:

None이 여러 곳에서 사용되지만 아마 가장 흔한 곳은 함수의 기본 반환 값에 사용되는 것입니다. 예를 들어 파이썬 3의 print() 함수는 아무 것도 반환하지 않지만 값을 받도록 쓸 수 있습니다:

이와 비슷하게 파이썬에서 반환값이 없는 함수는 실제로 None을 반환합니다.

불리언 타입

불리언 타입은 TrueFalse 값을 가질 수 있는 간단한 타입이고 이전에 설명한 것처럼 비교 연산자에 의해 반환되는 값입니다:

불리언 값은 다른 언어와는 달리 대소문자를 구별하므로 TrueFalse의 첫 글자는 반드시 대문자여야 합니다!

불리언은 bool() 함수를 사용하여 만들 수도 있습니다. 일정 규칙 하에서 다른 타입의 값을 불리언으로 변경합니다. 예를 들어, 숫자 0은 False이고 그외에는 True입니다:

None을 불리언으로 변환하면 항상 False입니다:

문자열일 경우 빈 문자열이면 bool(s)가 False이고 그 외에는 True입니다:

다음 섹션에서 볼 시퀀스 타입일 경우 시퀀스에 값이 없으면 False이고 그 외에는 True가 됩니다.

< 연산자 | 목차 | 기본 데이터 구조 >